package studia.figlewicz.math.test;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;

import oracle.net.aso.k;

import studia.figlewicz.math.library.*;

public class TEST_test_BS {
	

	public Double nominal = new Double(1);
	public Double cenaWykonaniaOpcji = new Double(100);
	
	
	
	
	public static void main(String[] args) {
		
		
		// dane dla przeplywow
		Date wygasniecie = new Date(101,0,1);
		Double nominal = new Double(1);
		Double cenaWykonaniaOpcji = new Double(100);
		
		
		
/////////////////////////////////////////////////////
		// projekcje
/////////////////////////////////////////////////////
		// zarzadca projekcji
		Date poczatekSymulacji = new Date(100,0,1);
		Date poczatekProjekcji = new Date(100,0,2);
		Date koniecProjekcji = new Date(101,11,31);
		Set<Date> datySymulacji = new HashSet<Date>();
//		datySymulacji.add(poczatekProjekcji);
//		datySymulacji.add(koniecProjekcji);
		datySymulacji.add(wygasniecie);
		ZarzadcaProjekcji zarzadcaProjekcji = new ZarzadcaProjekcji();
		
		// modele
		Model blackScholes = new ModelBlackScholes(MetodaInterpolacji.LINIOWA);
		zarzadcaProjekcji.dodajModel(blackScholes);
		ZmiennaObjasniajaca krzywaTerminowa = TEST_KrzywaStopyProcentowej.ShortRate_test();
		ZmiennaObjasniajaca zmiennosc = new Stala(0.0);
		ZmiennaObjasniajaca zmiennaLosowa = new ZmiennaLosowa(RozkladZmiennejLosowej.NORMALNY,0,1);
//		ZmiennaObjasniajaca cenaInstrumentuPodstawowego = new IndexSpot();
//		ZmiennaObjasniajaca cenaInstrumentuPodstawowego = new Stala(95.0);
		Konwencja konwencjaSpot = Utils.getStandardKonwencja();
//		cenaInstrumentuPodstawowego.addNotowanie(new NotowanieSpot(dataNotowania,96,konwencjaSpot));
		ZmiennaObjasniajaca cenaPoczatkowa = new Stala(100);
		blackScholes.setZmiennaObjasniajaca(ModelBlackScholes.ZMIENNA_OBJASNIAJACA_STOPA_PROCENTOWA,krzywaTerminowa);
		blackScholes.setZmiennaObjasniajaca(ModelBlackScholes.ZMIENNA_OBJASNIAJACA_ZMIENNOSC,zmiennosc);
		blackScholes.setZmiennaObjasniajaca(ModelBlackScholes.ZMIENNA_OBJASNIAJACA_CENA_POCZATKOWA,cenaPoczatkowa);
		blackScholes.setZmiennaObjasniajaca(ModelBlackScholes.ZMIENNA_OBJASNIAJACA_ZMIENNA_LOSOWA,zmiennaLosowa);
		
	// wykonanie projekcji
		int iloscSymulacji = 100;
		
		
		zarzadcaProjekcji.wykonajProjekcjeMonteCarlo(datySymulacji, poczatekSymulacji, iloscSymulacji);
		
/////////////////////////////////////////////////////
		// wycena
/////////////////////////////////////////////////////
		
		
		// zarzadca wyceny
		ZarzadcaWyceny zarzadcaWyceny = new ZarzadcaWyceny();

		PrzeplywPieniezny opcjaCall = new PrzeplywOpcyjnyEuropejski(wygasniecie,cenaWykonaniaOpcji,TypOpcji.CALL,nominal);
	
		ZmiennaRynkowa zmiennaRynkowa1 = new ZmiennaRynkowa(blackScholes,ModelBlackScholes.ZMIENNA_OBJASNIANA_BLACK_SCHOLES_PROCESS);
		
		opcjaCall.setZmienneRynkowe(PrzeplywOpcyjnyEuropejski.CENA_INSTRUMENTU_PODSTAWOWEGO, zmiennaRynkowa1);

		
		zarzadcaWyceny.dodajPrzeplyw(opcjaCall);
		
		
//		WynikWyceny ww2 = zarzadcaWyceny.wykonajWycene(opcjaPut,zarzadcaProjekcji.getMagazynWynikow(),0);
		
		zarzadcaWyceny.wycenaMonteCarlo(opcjaCall,zarzadcaProjekcji.getMagazynWynikow(),iloscSymulacji);

		WynikWyceny wwMC2 = opcjaCall.getWynikWyceny();

	}

	
}
